<?php
	// Une fonctionnalité pour changer son propre mot de passe
	// Auteur : Sebastian Mosser
	
	class fChangePasswd extends aFeature {
		
		public function __construct() {
			$this->_acl = new AccessControlList();
      		$this->_acl->setGranted(1); $this->_acl->setGranted(2); 
      		$this->_acl->setGranted(3); $this->_acl->setGranted(4); 
      		$this->_acl->setGranted(5); $this->_acl->setGranted(6);
      		$this->_acl->setGranted(7);
		}
		
		public static function getTocEntry() {
			return "Mot de passe";
		}
		
		public static function getRealName() {
			return "Changement du mot de passe";
		}
		
		public static function getSemantic() {
			return "Cette fonctionnalité permet aux utilisateurs de modifier leur mot de passe d'accès au système Balloon.";
		}
		
		protected function run() {
			return $this->process();
		}
		
		
		private function process() {
			$action = PropRetriever::getProp($_POST,"action");
			if ($action == "changePasswd")
				return $this->updatePasswd();
			else
				return $this->printForm();
		}
		
		
		private function isValidPasswd($user, $current, $new1, $new2) {
			$result = array();
			if (! Login::isGranted($user->getLogin(),sha1($current)))
				$result["current"] = "Mot de passe actuel incorrect !!";
			
			if (strlen($new1) < 6 or strlen($new2) < 6)
				$result["new"] = "Le nouveau mot de passe est trop court (minimum 6 caractères)";
				
			if ($new1 != $new2)
				$result["new"] = "Les 2 mots de passes ne correspondent pas !";
			return $result;
		}
		
		
		private function updatePasswd() {
			// Recupération de l'utilisateur courant
			$user = User::read(Login::getLoginId());
			// Récupération des informations du formulaire :
			$current = PropRetriever::getProp($_POST,"oldPasswd");
			$new1 = PropRetriever::getProp($_POST,"passwd1");
			$new2 = PropRetriever::getProp($_POST,"passwd2");
			
			$errors = $this->isValidPasswd($user,$current,$new1,$new2);
			
			if (! empty($errors))
				return $this->printForm($errors);
			
			$user->setPassword($new1);
			$user->update();
			return $this->updateConfirm();
		}
		
		
		private function updateConfirm() {
			$page = "<h1>Changement effectué avec succès</h1>\n";
			$page .= "<p>Votre nouveau mot de passe est désormais utilisable a partir de maintenant.</p>";
			$page .= "<p><strong>Remarque : </strong> Personne mis a part vous ne connait ce mot de passe. Si vous le perdez, l'administrateur Balloon pourra vous le changer, mais en aucun cas le retrouver !</p>";
			return $page;
		
		}
		
		
		private function printForm($error = array()) {
		  $page = "<h1>Changer mon mot de passe </h1>\n";
		  $page .= "<p>Veuillez saisir votre mot de passe actuel, puis renseigner votre nouveau mot de passe.</p>\n";
		  $page .= "<p>Pour éviter toute erreur, il vous est demandé de saisir une seconde fois votre nouveau mot de passe, afin de le vérifier.</p>\n";
		  
		  $page .= "<p>Pour valider votre modification, cliquez sur le bouton <code>Changer !</code></p>";

		 
		 $userErrors = "";
		 if (! empty($error)) {
      		$userErrors = 
      			"<p><b>Erreurs survenue lors du traitement du formulaire : </b><ul>\n";
      		foreach($error as $e)
      			$userErrors .= "  <li><span class=\"error\">${e}</span></li>\n";
      		$userErrors .= "</ul></p>\n";
	  }

		$curStyle = (PropRetriever::getProp($error,"current") == "" ? "" : "class=\"error\"");
		$newStyle = (PropRetriever::getProp($error,"new") == "" ? "" : "class=\"error\"");
		
		$curValue = PropRetriever::getProp($_POST,"oldPasswd");
		$new1Value = PropRetriever::getProp($_POST,"passwd1");
		$new2Value = PropRetriever::getProp($_POST,"passwd2");

		  $page .= <<<EOS
<div align="center">
  <form  accept-charset="utf-8" method="post">
    <fieldset>
      <legend>Modification du mot de passe</legend>
      <br />
      <label>
        <span ${curStyle} >Actuel : </span>
        <input type="password" name="oldPasswd" class="edit" value="${curValue}" /> &nbsp; &nbsp;
      </label>
      <br />
      <br />
      <label>
        <span ${newStyle} >Nouveau : </span>
        <input type="password" name="passwd1" class="edit" value="${new1Value}" /> &nbsp; &nbsp;
      </label>
      <br />
      <label>
        <span ${newStyle} >Confirmation : </span>
        <input type="password" name="passwd2" class="edit" value="${new2Value}" /> &nbsp; &nbsp;
      </label>
      <br />
      <input type="hidden" name="action"     value="changePasswd" />
      <input type="submit" value="Changer !" class="button" />
    </fieldset>
  </form>
</div>
<br />
${userErrors}
EOS;
		  return $page;
		
		
		}
	
	}

?>